<?php

namespace fastphp\facade;

use Exception;
use fastphp\Route;

final class Router
{
    public static array $routes = [];

    public static function addRoute($pattern, $controller, $action)
    {
       self::$routes[] = new Route($pattern, $controller, $action);
    }

    public static function match($requestUri)
    {
        foreach (self::$routes as $route) {
            // 这里使用简单的正则表达式匹配作为示例
            // 在实际应用中，你可能需要更复杂的匹配逻辑，比如使用第三方路由库
            if (preg_match('/^' . preg_quote($route->pattern, '/') . '$/', $requestUri, $matches)) {
                // 提取参数（如果有的话）
                if (count($matches) > 1) {
                    array_shift($matches); // 移除完整的匹配字符串
                    $route->parameters = array_combine(range(1, count($matches)), $matches);
                }
                return $route;
            }
        }
        // 如果没有匹配到任何路由，可以抛出一个异常或返回 null/false
        return null;
    }

    // 分发请求到相应的控制器和动作
    public static function dispatch($requestUri)
    {
        if (!empty($requestUri)){
            $route = self::match($requestUri);
            self::routerShow($route);
        }else{
            self::routerShow();
        }
    }

    /**
     * @param $route
     * @return void
     */
    private static function routerShow($route=null)
    {
        $controllerName = $route->controller ?? 'Index';
        $actionName = $route->action ?? 'index';

        // 包含控制器文件（假设控制器位于特定的目录中）
        require_once APP_PATH . 'application/controllers/' . $controllerName . 'Controller' . '.php';

        // 实例化控制器并调用动作方法
        $controllerClass = '\application\controllers\\' . ucfirst($controllerName) . 'Controller';
        $controller = new $controllerClass($controllerName, $actionName);

        // 传递参数给动作方法（如果有的话）
        $parameters = $route->parameters??[];
        $response = call_user_func_array([$controller, $actionName], $parameters);
        // 发送响应（这里假设响应是一个字符串或可以转换为字符串的对象）
        echo $response;
    }
}